/**
 * 扩展消息通信类型定义
 * WXT 会自动导入 utils/ 目录中的文件
 */

/**
 * 消息类型枚举
 * 定义扩展中使用的所有消息类型
 */
export enum MessageType {
  /** 获取标签页信息 */
  GET_TAB_INFO = "GET_TAB_INFO",
  /** 获取所有标签页 */
  GET_ALL_TABS = "GET_ALL_TABS",

  /** 保存数据 */
  SAVE_DATA = "SAVE_DATA",
  /** 获取数据 */
  GET_DATA = "GET_DATA",
  /** 删除数据 */
  DELETE_DATA = "DELETE_DATA",
  /** 清空所有数据 */
  CLEAR_ALL_DATA = "CLEAR_ALL_DATA",

  /** 高亮页面链接 */
  HIGHLIGHT_LINKS = "HIGHLIGHT_LINKS",
  /** 统计页面元素数量 */
  COUNT_ELEMENTS = "COUNT_ELEMENTS",
  /** 注入CSS样式 */
  INJECT_CSS = "INJECT_CSS",
  /** 滚动到页面顶部 */
  SCROLL_TO_TOP = "SCROLL_TO_TOP",
  /** 切换扩展UI显示 */
  TOGGLE_EXTENSION_UI = "TOGGLE_EXTENSION_UI",

  /** 显示浏览器通知 */
  SHOW_NOTIFICATION = "SHOW_NOTIFICATION",

  /** 获取扩展配置 */
  GET_CONFIG = "GET_CONFIG",
  /** 更新扩展配置 */
  UPDATE_CONFIG = "UPDATE_CONFIG",

  /** 存储变更广播（background -> content） */
  STORAGE_CHANGED = "STORAGE_CHANGED",
}

/**
 * 基础消息接口
 * 所有消息类型的基础接口
 */
export interface BaseMessage {
  /** 消息类型 */
  type: MessageType;
  /** 消息时间戳 */
  timestamp?: number;
  /** 请求ID */
  requestId?: string;
}

/**
 * 标签页信息接口
 * 描述浏览器标签页的基本信息
 */
export interface TabInfo {
  /** 标签页ID */
  id?: number;
  /** 标签页URL */
  url?: string;
  /** 标签页标题 */
  title?: string;
  /** 是否为活动标签页 */
  active?: boolean;
  /** 所属窗口ID */
  windowId?: number;
}

/**
 * 存储数据接口
 * 通用的存储数据结构
 */
export interface StorageData {
  /** 任意键值对数据 */
  [key: string]: any;
  /** 数据时间戳 */
  timestamp?: number;
  /** 数据版本 */
  version?: string;
}

/**
 * 扩展配置接口
 * 定义扩展的用户配置选项
 */
export interface ExtensionConfig {
  /** 主题设置 */
  theme: "light" | "dark" | "auto";
  /** 自动高亮链接 */
  autoHighlight: boolean;
  /** 启用的功能列表 */
  enabledFeatures: string[];
  /** 配置版本 */
  version: string;
}

/**
 * 消息请求类型定义
 * 具体的消息请求接口
 */
export interface GetTabInfoRequest extends BaseMessage {
  type: MessageType.GET_TAB_INFO;
}

/** 保存数据请求接口 */
export interface SaveDataRequest extends BaseMessage {
  type: MessageType.SAVE_DATA;
  /** 存储键名 */
  key: string;
  /** 要保存的数据 */
  data: any;
}

/** 获取数据请求接口 */
export interface GetDataRequest extends BaseMessage {
  type: MessageType.GET_DATA;
  /** 存储键名(可选，不提供则获取所有数据) */
  key?: string;
}

/** 统计元素数量请求接口 */
export interface CountElementsRequest extends BaseMessage {
  type: MessageType.COUNT_ELEMENTS;
  /** CSS选择器 */
  selector: string;
}

/** 注入CSS请求接口 */
export interface InjectCSSRequest extends BaseMessage {
  type: MessageType.INJECT_CSS;
  /** CSS样式代码 */
  css: string;
  /** 样式标签ID(可选) */
  id?: string;
}

/** 显示通知请求接口 */
export interface ShowNotificationRequest extends BaseMessage {
  type: MessageType.SHOW_NOTIFICATION;
  /** 通知标题 */
  title: string;
  /** 通知内容 */
  message: string;
  /** 通知类型 */
  notificationType?: "basic" | "image" | "list" | "progress";
}

/**
 * 消息响应类型定义
 * 具体的消息响应接口
 */
export interface BaseResponse {
  /** 操作是否成功 */
  success: boolean;
  /** 错误信息 */
  error?: string;
  /** 响应时间戳 */
  timestamp: number;
}

/** 标签页信息响应接口 */
export interface TabInfoResponse extends BaseResponse {
  /** 单个标签页信息 */
  tabInfo?: TabInfo;
  /** 所有标签页信息 */
  allTabs?: TabInfo[];
}

/** 数据响应接口 */
export interface DataResponse extends BaseResponse {
  /** 返回的数据 */
  data?: any;
  /** 数据键名 */
  key?: string;
}

/** 存储变更通知（background -> content） */
export interface StorageChangedNotification extends BaseMessage {
  type: MessageType.STORAGE_CHANGED;
  changes: Record<string, { oldValue?: any; newValue?: any } | undefined>;
}

/** 元素统计响应接口 */
export interface CountElementsResponse extends BaseResponse {
  /** 元素数量 */
  count: number;
  /** 使用的选择器 */
  selector: string;
}

/**
 * 消息处理器类型
 * 用于处理消息的函数类型定义
 */
export type MessageHandler<T extends BaseMessage = BaseMessage, R extends BaseResponse = BaseResponse> = (
  /** 接收到的消息 */
  message: T,
  /** 消息发送者信息 */
  sender: Browser.runtime.MessageSender
) => Promise<R> | R;
